package com.huluobo.sign.view

import android.location.Geocoder.GeocodeListener
import android.text.TextUtils
import android.util.Log
import android.util.TimeUtils
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.compose.ui.viewinterop.AndroidView
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NavHostController
import com.amap.api.maps.AMap
import com.amap.api.maps.MapView
import com.amap.api.maps.model.MyLocationStyle
import com.amap.api.services.core.LatLonPoint
import com.amap.api.services.geocoder.GeocodeResult
import com.amap.api.services.geocoder.GeocodeSearch
import com.amap.api.services.geocoder.RegeocodeQuery
import com.amap.api.services.geocoder.RegeocodeResult
import com.blankj.utilcode.util.ToastUtils
import com.huluobo.lib_base.BaseApp
import com.huluobo.lib_base.BaseTitle
import com.huluobo.lib_base.UIState
import com.huluobo.lib_http.Const
import com.huluobo.sign.SignIntent
import com.huluobo.sign.SignViewModel
import com.tencent.mmkv.MMKV
import kotlinx.coroutines.launch
import java.text.SimpleDateFormat
import java.time.LocalTime
import java.util.Timer
import kotlin.concurrent.timerTask

/**
 *  Created by LC on 2025/3/29.
 *  实现高德地图
 *  1.声明map和mapview,一个是地图本体,一个是展示地图的view
 *  2.声明myLocationStyle 定位的功能,需要在map上实现
 *  3.app中需要声明隐私策略,返回值都为true
 *  4.主壳app中的build.gradle需要声明ndk中的cpu架构
 *  5.声明动态权限,2个Location的,2个读写sd卡的
 *
 */
lateinit var map: AMap
lateinit var mapView: MapView
lateinit var myLocationStyle: MyLocationStyle

//地理位置信息检索
lateinit var geocodeSearch: GeocodeSearch

//地理位置信息查询
lateinit var query: RegeocodeQuery

//计时器
lateinit var timer: Timer

@Composable
fun SignCommitPage(navHostController: NavHostController, vm: SignViewModel = hiltViewModel()) {

    //上班打卡显示时间,默认显示一个字符串
    var startTime by remember {
        mutableStateOf("上班还未打卡")
    }

    //下班打卡时间
    var endTime by remember {
        mutableStateOf("下班还未打卡")
    }

    //打卡按钮文字
    var btnName by remember {
        mutableStateOf("上班打卡")
    }

    //按钮上显示的时间
    var nowTime by remember {
        mutableStateOf("00:00:00")
    }

    //打卡按钮是否可以点击,默认为true,如果打完下班卡,当日不可再次点击
    var enable by remember {
        mutableStateOf(true)
    }

    //存储打卡时间
    val kv = MMKV.defaultMMKV()

    var lat by remember {
        mutableStateOf(0.0)
    }
    var lon by remember {
        mutableStateOf(0.0)
    }
    var type = ""
    var status = ""
    var address by remember {
        mutableStateOf("")
    }

    LaunchedEffect(key1 = "", block = {
        //计时器的协程,用于更新当前按钮上的时间
        launch {
            timer = Timer()
            timer.schedule(timerTask {
                nowTime = SimpleDateFormat("HH:mm:ss").format(System.currentTimeMillis())
            }, 0, 1000)
        }

        launch {
            //取出上班打卡的时间
            val signTime = kv.decodeString(Const.PARAM_SIGN_IN, "").toString()
            if (!TextUtils.isEmpty(signTime)) {
                //如果上班打卡不为空,说明打过卡,需要判断是否是今天,如果是今天,再取出下班时间
                //获取当前时间
                val time = SimpleDateFormat("yyyy-MM-dd").format(System.currentTimeMillis())
                //2025-03-31
                //2025-03-31 11:28:00
                //截取当前日期  yyyy-MM-dd HH:mm:ss
                val signDate = signTime.substring(0, 10)
                //判断当前时间和kv中取出的打卡时间做对比,如果相等,说明今天打过卡
                if (time == signDate) {
                    startTime = "上班时间 : $signTime"
                    btnName = "下班打卡"
                    //上班时间判断完毕了,需要取出下班时间来做判断
                    val outTime = kv.decodeString(Const.PARAM_SIGN_OUT, "")
                    if (!TextUtils.isEmpty(outTime)) {
                        val outDate = outTime?.substring(0, 10)
                        if (time == outDate) {
                            //如果当前时间和下班卡时间对比,也相同,证明今天也打过下班卡
                            endTime = "下班时间 : $outTime"
                            //今日上班卡下班卡都完毕了,不允许再次打卡
                            enable = false
                        }
                    }
                } else {
                    btnName = "上班打卡"
                }
            }
        }

        launch {
            vm.state.collect {
                when (it) {
                    is UIState.OnError -> {
                        Log.e("TagA", "添加签到信息失败:${it.msg}")
                    }

                    UIState.OnLoading -> {}
                    is UIState.OnSuccess<*> -> {
                        ToastUtils.showLong("签到/签退成功")
                        navHostController.popBackStack()
                    }
                }
            }
        }

    })


    Column(Modifier.padding(10.dp), horizontalAlignment = Alignment.CenterHorizontally) {
        BaseTitle(title = "签到/签退", navHostController = navHostController)
        AndroidView(modifier = Modifier.height(300.dp), factory = {
            //创建一个mapView视图
            mapView = MapView(it)
            //创建地图
            mapView.onCreate(null)
            map = mapView.map
            myLocationStyle = MyLocationStyle()
            myLocationStyle.interval(2000)
            map.myLocationStyle = myLocationStyle
            map.isMyLocationEnabled = true
            map.addOnMyLocationChangeListener { location ->

                geocodeSearch = GeocodeSearch(BaseApp.context)
                query = RegeocodeQuery(LatLonPoint(location.latitude, location.longitude), 200f, GeocodeSearch.AMAP)
                geocodeSearch.getFromLocationAsyn(query)
                geocodeSearch.setOnGeocodeSearchListener(object : GeocodeSearch.OnGeocodeSearchListener {
                    override fun onRegeocodeSearched(result: RegeocodeResult?, error: Int) {
                        Log.i("TagA", "result:${result?.regeocodeAddress?.formatAddress.toString()}")
                        lon = location.longitude
                        lat = location.latitude
                        address = result?.regeocodeAddress?.formatAddress.toString()
                    }

                    override fun onGeocodeSearched(p0: GeocodeResult?, p1: Int) {
                    }
                })
            }

            mapView
        })

        Spacer(modifier = Modifier.height(50.dp))
        Text(
            text = startTime,
            Modifier
                .fillMaxWidth()
                .padding(start = 20.dp)
        )
        Spacer(modifier = Modifier.height(20.dp))
        Text(
            text = endTime,
            Modifier
                .fillMaxWidth()
                .padding(start = 20.dp)
        )
        Spacer(modifier = Modifier.height(20.dp))
        Button(
            onClick = {
                val time = SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(System.currentTimeMillis())
                val workTime = SimpleDateFormat("HH:mm:ss").format(System.currentTimeMillis())
                if (btnName == "上班打卡") {
                    //如果进入时为上班打卡,点击按钮保存签到时间
                    kv.encode(Const.PARAM_SIGN_IN, time)
                    val workStart = LocalTime.of(8, 0)
                    startTime = if (LocalTime.parse(workTime).isAfter(workStart)) {
                        status = "迟到"
                        "上班时间 : $time 迟到"
                    } else {
                        status = "正常"
                        "上班时间 : $time 打卡正常"
                    }
                    btnName = "下班打卡"
                    type = "上班"
                    val map = mapOf(
                        Const.PARAM_SIGN_LAT to lat,
                        Const.PARAM_SIGN_LON to lon,
                        Const.PARAM_SIGN_TYPE to type,
                        Const.PARAM_SIGN_STATUS to status,
                        Const.PARAM_SIGN_ADDRESS to address
                    )
                    vm.sendIntent(SignIntent.AddSign(map))
                } else {
                    kv.encode(Const.PARAM_SIGN_OUT, time)
                    val workEnd = LocalTime.of(17, 0)
                    endTime = if (LocalTime.parse(workTime).isBefore(workEnd)) {
                        status = "早退"
                        "下班时间 : $time 早退"
                    } else {
                        status = "正常"
                        "下班时间 : $time 打卡正常"
                    }
                    type = "下班"
                    val map = mapOf(
                        Const.PARAM_SIGN_LAT to lat,
                        Const.PARAM_SIGN_LON to lon,
                        Const.PARAM_SIGN_TYPE to type,
                        Const.PARAM_SIGN_STATUS to status,
                        Const.PARAM_SIGN_ADDRESS to address
                    )
                    vm.sendIntent(SignIntent.AddSign(map))
                    enable = false
                }
            }, enabled = enable, modifier = Modifier
                .size(140.dp)
                .clip(CircleShape)
        ) {
            Column {
                Text(text = btnName, fontSize = 22.sp)
                Text(text = nowTime, fontSize = 22.sp)
            }
        }
    }
}